package com.ftg.learn.chapter08.pattern.proxy.defendant1;

import java.lang.reflect.Proxy;

/**
 * 动态代理
 *
 * @author lijiaxin
 * @version 1.0
 * @date 2023/8/4 14:15
 */

public class Court1 {

    public static void main(String[] args) {

        //动态代理  ：动态代理（Dynamic Proxy）是一种在运行时动态生成代理对象的技术。
        // 它是一种设计模式，用于在不修改原始对象的情况下，通过代理对象来间接访问原始对象，
        // 并在访问前后执行额外的操作。

        //反射机制  ：反射是Java的特征之一，是一种间接操作目标对象的机制，核心是JVM在运行的时候才动态加载类，并且对于任意一个类，
        // 都能够知道这个类的所有属性和方法，调用方法/访问属性，不需要提前在编译期知道运行的对象是谁，
        // 他允许运行中的Java程序获取类的信息，并且可以操作类或对象内部属性。程序中对象的类型一般都是在编译期就确定下来的，
        // 而当我们的程序在运行时，可能需要动态的加载一些类，这些类因为之前用不到，所以没有加载到jvm，
        // 这时，使用Java反射机制可以在运行期动态的创建对象并调用其属性，它是在运行时根据需要才加载。

    //        spring aop 底层实现

    //动态代理  o 是Sayinterface接口的父类
//        Sayinterface 的实现类的实例 向上转型成了 Object  向下转型
    Sayinterface o = (Sayinterface) Proxy.newProxyInstance(
            Sayinterface.class.getClassLoader(),
            new Class[]{Sayinterface.class},
            (proxy, method, args1) -> {
                System.out.println('a');
                return proxy;
            }
    );

    Sayinterface o1 = (Sayinterface)Proxy.newProxyInstance(
            //类加载器
            Sayinterface.class.getClassLoader()
            //哪个类生成代码
            , new Class[]{Sayinterface.class}
            //动态生成相应的方法
            , (x, y, z) -> {
                System.out.println("你好我是你的律师 ");
                System.out.println("我帮你说话");
                return x;
            });
    o1.say();
}
}
